package com.focus.pay.ali.utils;

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.crypto.SecureUtil;
import cn.hutool.crypto.asymmetric.Sign;
import cn.hutool.crypto.asymmetric.SignAlgorithm;

import java.util.*;
import java.util.stream.Collectors;

/**
 * @author 赵参谋
 * @version $
 * =========================================================================
 * 变更履历：
 * -------------------------------------------------------------------------
 * 变更编号     变更时间    变更人   变更原因    变更内容
 * -------------------------------------------------------------------------
 * <p>
 * @description：支付宝工具
 * @date 2022/1/17 10:41
 **/
public class AliPayUtils {

    /**
     * 生成待签名字符串
     * @param map 待签名对象
     * @return 签名字符串
     */
    public static String buildSignStr(Map map){
        //排序
        List<Map.Entry<String, String>> sortList = new ArrayList<Map.Entry<String, String>>(map.entrySet());
        Collections.sort(sortList, new Comparator<Map.Entry<String, String>>() {
            public int compare(Map.Entry<String, String> o1, Map.Entry<String, String> o2) {
                return  o1.getKey().compareToIgnoreCase(o2.getKey());
            }
        });
        //待加密字符串,组装参数
        return sortList.stream().map(x -> x.getKey()+"="+x.getValue()).collect(Collectors.joining("&"));
    }

    /**
     * 生成待签名字符串
     * @param t 待签名对象
     * @return 签名字符串
     */
    public static <T> String buildSignStr(T t){
        Map map = BeanUtil.beanToMap(t);
        return buildSignStr(map);
    }

    /**
     * RSA2加密
     * 加密算法：SHA256WithRSA
     * @param str 待签名字符串
     * @param privateKey 私钥
     * @return 加密字符串
     */
    public static String RSA2Encryption(String str,String privateKey){
        Sign sign = SecureUtil.sign(SignAlgorithm.SHA256withRSA,privateKey,null);
        return sign.signHex(str);
    }

    /**
     * RSA加密
     * 加密算法：SHA1WithRSA
     * @param str 待加密字符串
     * @param privateKey 私钥
     * @return 加密字符串
     */
    public static String RSAEncryption(String str,String privateKey){
        Sign sign = SecureUtil.sign(SignAlgorithm.SHA1withRSA,privateKey,null);
        return sign.signHex(str);
    }
}
